import _ from "lodash"
import { article, section } from "./lablog.js";
const {curry, curryRight}  = _;

article("柯里化的基本概念: 只传递给函数的一部分来调用它，让它返回一个函数去处理剩下的参数。")
article("通常会策略性地将要操作的数据放到最后一个参数里面")

const match = curry(function(what, str) {
    return str.match(what)
})

const helloMatch = match(/hello/)
console.log(helloMatch("I am your friends, hello."))

const filter = curry((f, ary) => {
    return ary.filter(f)
})
const nonSenseFilter = filter(v => v)
console.log(nonSenseFilter([1, false, 0, true, "", "ok"]))


section("curry 的用途非常广泛，只需要给函数一些参数，就可以得到新的函数。只传给函数一部分参数通常也叫做局部调用 partial application。能够大量减少样板文件代码。哪怕输出的是另一个函数，它也是纯函数。")
const map = curryRight(_.map)
const arrAdd2 = map(x => x + 2)
console.log(arrAdd2([1,2,3]))
console.log(arrAdd2(["4", "x", "y"]))

function test(p1, p2, p3) {
    console.log(`${p1}, ${p2}, ${p3}`)
}
section("测试 lodash curryRight & curry")
curryRight(test)(1)(2)(3)
curry(test)(1)(2)(3)